package main

import "fmt"

/* type 接口名 interface{
	方法名1(参数1,参数2...)(返回值1,返回值2...)
	方法名2(参数1,参数2...)(返回值1,返回值2...)
}
用来给变量\参数\返回值等设置类型

一个变量如果实现了接口中规定的所有的方法，
那么这个变量就实现了这个接口
可以称为这个接口类型的变量
*/
//接口的实现

type animal interface {
	move()
	eat(food string)
}

type cat struct {
	name string
	feet int8
}

type chicken struct {
	feet int8
}

func (c chicken) move() {
	fmt.Println("鸡跑的很快")
}

func (c chicken) eat(food string) {
	fmt.Printf("鸡吃%s \n", food)
}

func (c cat) move() {
	fmt.Println("猫上房")
}

func (c cat) eat(food string) {
	fmt.Printf("小猫%s爱吃%s \n", c.name, food)
}

func sx(a animal, food string) {
	a.move()
	a.eat(food)
}

func main() {
	c1 := chicken{
		feet: 2,
	}
	sx(c1, "玉米")

	c2 := cat{
		name: "花花",
		feet: 2,
	}
	sx(c2, "鱼")

	var a1 animal //定义一个接口类型的变量

	fmt.Printf("%T---%v \n", a1, a1)
	c3 := cat{ //定义一个cat类型的变量c3
		name: "花花",
		feet: 2,
	}
	//接口保存的分为两部分：动态值得类型和值本身
	//这样就实现了接口变量能够存储不同的值
	a1 = c3
	a1.eat("123")
	fmt.Printf("%T---%v \n", a1, a1)
}
